package com.gmall.pms.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @Author: liush
 * @CreateTime: 2023-05-16  18:23
 * @Description: TODO
 */
@Slf4j
@Configuration
public class RabbitConfig {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init() {
        /*
         * 使用rabbbitTemplate.setConfirmCallback设置回调函数。当消息发送到exchange后回调confirm方法，
         * 在方法中判断ack，如果为true，则发送成功，如果为false，则发送失败，需要处理
         * */
        this.rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            if (!ack) {
                log.error("消息没有到达交换机！原因：" + cause);
            }
        });
        /*
         * 使用rabbitTemplate.setRetrurnCallback设置退回函数，当消息从exchange路由到queue失败后，
         * 如果设置了rabbitTemplate.setMandatory(true)参数，则会将消息退回给producer，并执行回调函数returnMessage
         * */
        this.rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
            log.error("消息没有到达队列！交换机：{}，路由键：{}，消息内容：{}，回调状态码：{}，回调文本：{}",
                    exchange, routingKey, new String(message.getBody()), replyCode, replyText);
        });
    }
}
